手機APP的消息推送(Push Notification),我們可以將其分為兩大類:本地通知與遠端通知。
本地通知:
由 APP 本身所發起的通知。不需要外部伺服器。舉例來說,當你設定一個鬧鐘或提醒,而該時間到達時 APP 會提醒你,即為本地通知。
遠端通知:
由外部伺服器所發起,並發送到已註冊的設備上。簡單來說,當伺服器需要將訊息發送到指定的APP時,就會使用遠端通知。這通常需要一個中間的消息推送平台,例如 Firebase Cloud Messaging (FCM)。
在本篇中,我們會介紹本地通知如何實現。下一篇文章,會介紹如何利用 Firebase Cloud Messaging API 來實現遠端通知。
安裝 react-native-push-notification 套件
npm install --save react-native-push-notification
配置 Android 原生文件
android/build.gradle
:
googlePlayServicesVersion = "+" // default: "+"
firebaseMessagingVersion = "21.1.0" // default: "21.1.0
android/app/src/main/AndroidManifest.xml
新增以下權限:
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
在 <application ....>
內新增:
<application ....>
<!-- Change the value to true to enable pop-up for in foreground on receiving remote notifications (for prevent duplicating while showing local notifications set this to false) -->
<meta-data android:name="com.dieam.reactnativepushnotification.notification_foreground"
android:value="false"/>
<!-- Change the resource name to your App's accent color - or any other color you want -->
<meta-data android:name="com.dieam.reactnativepushnotification.notification_color"
android:resource="@color/white"/> <!-- or @android:color/{name} to use a standard color -->
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationActions" />
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
<receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
<service
android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
```
android/app/src/main/res/values
新增 colors.xml 檔案,並加入以下內容:
<resources>
<color name="white">#FFF</color>
</resources>
引入所需模組
首先,我們要在項目的root(通常是index.js)中引入react-native-push-notification並進行一些基本配置。
import PushNotification from "react-native-push-notification";
PushNotification.configure({
onNotification: function (notification) {
console.log('LOCAL NOTIFICATION ==>', notification);
},
requestPermissions: Platform.OS === 'ios',
});
創建通知頻道:
PushNotification.createChannel(
{
channelId: "hello", // (required)
channelName: "My channel", // (required)
channelDescription: "A channel for general notifications", // (optional) default: undefined.
playSound: true, // (optional) default: true
soundName: "default", // (optional) See `soundName` parameter of `localNotification` function
importance: 4, // (optional) default: 4. Int value of the Android notification importance
vibrate: true, // (optional) default: true. Creates the default vibration pattern if true.
},
(created) => console.log(`createChannel 'your-channel-id' returned '${created}'`) // (optional) callback returns whether the channel was created, false means it already existed.
);
發送本地通知:
我們在首頁做一個按鈕,點擊後推送消息
const handlePress = () => {
PushNotification.localNotification({
channelId: "hello",
title: "123",
message: "Hello World",
playSound: true,
soundName: "default",
number: 1,
});
};
return (
<View style={styles.container}>
<Button title="發送通知" onPress={handlePress} />
</View>
);
完成!
完整代碼
index.js
import {AppRegistry} from 'react-native';
import App from './App';
import {name as appName} from './app.json';
import PushNotification from "react-native-push-notification";
PushNotification.configure({
onNotification: function (notification) {
console.log('LOCAL NOTIFICATION ==>', notification);
},
// This line solves the problem that I was facing.
requestPermissions: Platform.OS === 'ios',
});
PushNotification.createChannel(
{
channelId: "hello", // (required)
channelName: "My channel", // (required)
channelDescription: "A channel for general notifications", // (optional) default: undefined.
playSound: true, // (optional) default: true
soundName: "default", // (optional) See `soundName` parameter of `localNotification` function
importance: 4, // (optional) default: 4. Int value of the Android notification importance
vibrate: true, // (optional) default: true. Creates the default vibration pattern if true.
},
(created) => console.log(`createChannel 'your-channel-id' returned '${created}'`) // (optional) callback returns whether the channel was created, false means it already existed.
);
AppRegistry.registerComponent(appName, () => App);
App.js
import React from 'react';
import { Button, View, StyleSheet } from 'react-native';
import PushNotification from "react-native-push-notification";
function App() {
const handlePress = () => {
PushNotification.localNotification({
channelId: "hello",
title: "123",
message: "Hello World",
playSound: true,
soundName: "default",
number: 1,
});
};
return (
<View style={styles.container}>
<Button title="發送通知" onPress={handlePress} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
}
});
export default App;
https://github.com/zo0r/react-native-push-notification